home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 May: Tool Chest / Developer CD Series May 1996 (Tool Chest) (Apple Computer) (1996).iso / Tool Chest / QuickDraw / Bitblitz 1.0 / Source / MainStuff.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-10-09  |  18.6 KB  |  679 lines  |  [TEXT/MPS ]

  1. /*--------------------------------------------------------------------------------------
  2. //
  3. //    File:          MainStuff.c
  4. //
  5. //    Contents:    Main event loop.  Only those portions needed for support of the tools 
  6. //                features have been included.
  7. //
  8. //
  9. //    By Georgiann ("George") Delaney
  10. //    © 1989 - 1990, Apple Computer, Inc.
  11. //
  12. //--------------------------------------------------------------------------------------*/
  13.  
  14.  
  15. #include "MacHeaders.h"
  16.  
  17. #include "BitBlitz.h"
  18. #include "MainStuff.h"
  19.  
  20.  
  21. #pragma segment main
  22.  
  23.  
  24.  
  25. /*======================================================================================*/
  26. /*  Shell Global Variables     */
  27.  
  28. Boolean        gFinished        = false;            /* Does the user want to quit the application?         */
  29.  
  30. Boolean        gWNEAvailable;                        /* Specifies if WaitNextEvent is available             */
  31. Boolean        gInBackground     = false;            /* Is the application in the background under MF      */ 
  32.  
  33. Handle        gtheMenuBar;                        /* Handle to the tool menus                         */
  34. MenuHandle    gtheMenus[kMenuCount+kHeirCount];    /* Structure holding the application menus             */    
  35.  
  36. short        gCmdOn            = false;            /* Is the command key being pressed?                 */
  37.  
  38. Boolean        gDoubleClick    = false;            /* Determines if the user double-clicked             */
  39. long        gLastTime;
  40. Point        gLastPoint;                            
  41.  
  42.  
  43.  
  44. /*======================================================================================*/
  45. /*    Setup Routines  */
  46.  
  47.  
  48.  
  49. /*--------------------------------------------------------------------------------------*/
  50. void SetUpMenu()
  51. /*
  52. //    This procedure reads in all of the menu resources and builds the application 
  53. //    menu.
  54. */
  55. {
  56.     short    n;
  57.  
  58.     InitMenus();
  59.     
  60.     gtheMenus[kAppleMenu]     = GetMenu( kAppleMenuID );
  61.     AddResMenu(gtheMenus[kAppleMenu],'DRVR');
  62.     
  63.     gtheMenus[kFileMenu]      = GetMenu(kFileMenuID);
  64.     gtheMenus[kEditMenu]      = GetMenu(kEditMenuID);
  65.     gtheMenus[kOptionsMenu]   = GetMenu(kOptionsMenuID);
  66.  
  67.      gtheMenus[khCopyModeMenu] = GetMenu(khCopyModeMenuID);
  68.      gtheMenus[khClipRgnMenu]  = GetMenu(khClipRgnMenuID);
  69.      gtheMenus[khVisRgnMenu]   = GetMenu(khVisRgnMenuID);
  70.      gtheMenus[khMaskRgnMenu]  = GetMenu(khMaskRgnMenuID);
  71.  
  72.      gtheMenus[khFGColorMenu]  = GetMenu(khFGColorMenuID);
  73.      gtheMenus[khBKColorMenu]  = GetMenu(khBKColorMenuID);
  74.      gtheMenus[khOPColorMenu]  = GetMenu(khOPColorMenuID);
  75.      gtheMenus[khHiliteMenu]   = GetMenu(khHiliteMenuID);
  76.  
  77.       for ( n = 0; n < kMenuCount; n++ ) 
  78.         InsertMenu(gtheMenus[n],0);
  79.  
  80.       for ( n = n; n < (kMenuCount+kHeirCount); n++ ) 
  81.         InsertMenu(gtheMenus[n], hierMenu);
  82.  
  83.     gtheMenuBar = GetMenuBar();  
  84.     DrawMenuBar();
  85. }
  86.  
  87.  
  88. /*--------------------------------------------------------------------------------------*/
  89. void InitAppMenus()
  90. {
  91.  
  92.     if (!gColorAvail)  {
  93.        DisableItem(gtheMenus[kOptionsMenu], kSrcOr );
  94.        DisableItem(gtheMenus[kOptionsMenu], kSrcXor );
  95.        DisableItem(gtheMenus[kOptionsMenu], kSrcBic );
  96.        DisableItem(gtheMenus[kOptionsMenu], kNotSrcCopy );
  97.        DisableItem(gtheMenus[kOptionsMenu], kNotSrcOr );
  98.        DisableItem(gtheMenus[kOptionsMenu], kNotSrcXor );
  99.        DisableItem(gtheMenus[kOptionsMenu], kNotSrcBic );
  100.        DisableItem(gtheMenus[kOptionsMenu], kBlend );
  101.        DisableItem(gtheMenus[kOptionsMenu], kAddPin );
  102.        DisableItem(gtheMenus[kOptionsMenu], kAddOver );
  103.        DisableItem(gtheMenus[kOptionsMenu], kAddMin );
  104.        DisableItem(gtheMenus[kOptionsMenu], kAddMax );
  105.        DisableItem(gtheMenus[kOptionsMenu], kSubPin );
  106.        DisableItem(gtheMenus[kOptionsMenu], kSubOver );
  107.        DisableItem(gtheMenus[kOptionsMenu], kTransparent );
  108.        DisableItem(gtheMenus[kOptionsMenu], kHilite );
  109.        }
  110.     else
  111.         CheckItem  (gtheMenus[khCopyModeMenu],CopyMode2ModeMenuItem(gCopyMode),true);
  112.  
  113. }
  114.  
  115. /*--------------------------------------------------------------------------------------*/
  116. void InitMac()
  117. /*
  118. //    This procedure executes all Macintosh initialization functions. 
  119. */
  120. {
  121.     EventRecord    theEvent;
  122.     
  123.     MaxApplZone();
  124.     MoreMasters();    MoreMasters();    MoreMasters();    MoreMasters();
  125.  
  126.     InitGraf(&qd.thePort);
  127.     InitFonts();
  128.     InitWindows();
  129.     SetUpMenu();
  130.     TEInit();
  131.     InitDialogs(nil);
  132.     InitCursor();
  133.     InitAllPacks();
  134.             
  135.     gWNEAvailable = myTrapAvailable(_WaitNextEvent, ToolTrap);
  136.  
  137.     EventAvail(everyEvent,&theEvent);    /* Force windows to front… (for MF) */
  138. }
  139.  
  140.  
  141.  
  142.  
  143. /*======================================================================================*/
  144. /*    Main Loop and Event Management Routines  */
  145.  
  146.  
  147. /*--------------------------------------------------------------------------------------*/
  148. Boolean IsDAWindow( window )
  149.     WindowPtr    window;
  150. {
  151.     if ( window == nil )
  152.         return false;
  153.     else    
  154.         return ( (WindowPeek) window)->windowKind < 0;
  155.  
  156.  
  157. /*--------------------------------------------------------------------------------------*/
  158. void AdjustMenusForDA()
  159. {
  160.     EnableItem (gtheMenus[kFileMenu], kNew);
  161.     EnableItem (gtheMenus[kFileMenu], kOpen);
  162.     EnableItem (gtheMenus[kFileMenu], kClose);
  163.     EnableItem (gtheMenus[kFileMenu], kSave);
  164.     EnableItem (gtheMenus[kFileMenu], kSaveAs);
  165.     EnableItem (gtheMenus[kFileMenu], kPageSetUp);
  166.     EnableItem (gtheMenus[kFileMenu], kPrint);
  167.     EnableItem (gtheMenus[kFileMenu], kQuit);
  168.  
  169.     EnableItem (gtheMenus[kEditMenu], kUndo);
  170.     EnableItem (gtheMenus[kEditMenu], kCut);
  171.     EnableItem (gtheMenus[kEditMenu], kCopy);
  172.     EnableItem (gtheMenus[kEditMenu], kPaste);
  173.     EnableItem (gtheMenus[kEditMenu], kClear);
  174.  
  175.     DisableItem(gtheMenus[kOptionsMenu], kSrcAttributes );
  176.     DisableItem(gtheMenus[kOptionsMenu], kMskAttributes );
  177.     DisableItem(gtheMenus[kOptionsMenu], kDstAttributes );
  178.     
  179.     DisableItem(gtheMenus[kOptionsMenu], kTrapSelect);
  180.     DisableItem(gtheMenus[kOptionsMenu], kCopyModeSelect);
  181.     DisableItem(gtheMenus[kOptionsMenu], kMaskRgnSelect);
  182.  
  183.  
  184. /*--------------------------------------------------------------------------------------*/
  185. void AdjustMenusForApp()
  186. {
  187.     DisableItem(gtheMenus[kFileMenu], kNew);
  188.     DisableItem(gtheMenus[kFileMenu], kOpen);
  189.     DisableItem(gtheMenus[kFileMenu], kClose);
  190.     DisableItem(gtheMenus[kFileMenu], kSave);
  191.     DisableItem(gtheMenus[kFileMenu], kSaveAs);
  192.     DisableItem(gtheMenus[kFileMenu], kPageSetUp);
  193.     DisableItem(gtheMenus[kFileMenu], kPrint);
  194.     EnableItem (gtheMenus[kFileMenu], kQuit);
  195.  
  196.     DisableItem(gtheMenus[kEditMenu], kUndo);
  197.     DisableItem(gtheMenus[kEditMenu], kCut);
  198.     DisableItem(gtheMenus[kEditMenu], kCopy);
  199.     DisableItem(gtheMenus[kEditMenu], kPaste);
  200.     DisableItem(gtheMenus[kEditMenu], kClear);
  201.  
  202.     EnableItem (gtheMenus[kOptionsMenu], kSrcAttributes );
  203.     EnableItem (gtheMenus[kOptionsMenu], kMskAttributes );
  204.     EnableItem (gtheMenus[kOptionsMenu], kDstAttributes );
  205.     
  206.     EnableItem (gtheMenus[kOptionsMenu], kTrapSelect);
  207.         
  208.     EnableItem (gtheMenus[kOptionsMenu],  kFGColor);
  209.     CheckItem  (gtheMenus[khFGColorMenu], gFGColor.menuIndex,    true);
  210.     
  211.     EnableItem (gtheMenus[kOptionsMenu],  kBKColor);
  212.     CheckItem  (gtheMenus[khBKColorMenu], gBKColor.menuIndex,    true);
  213.  
  214.     EnableItem (gtheMenus[kOptionsMenu],  kClipRgnSelect);
  215.     CheckItem  (gtheMenus[khClipRgnMenu], gRList[kClpRgn].type,    true);
  216.  
  217.     EnableItem (gtheMenus[kOptionsMenu],  kVisRgnSelect);
  218.     CheckItem  (gtheMenus[khVisRgnMenu],  gRList[kVisRgn].type,    true);
  219.  
  220.     EnableItem (gtheMenus[kOptionsMenu],  kUseScreenBits);
  221.     CheckItem  (gtheMenus[kOptionsMenu],  kUseScreenBits,          gUseScreenBits);
  222.  
  223.     EnableItem (gtheMenus[kOptionsMenu],  kDither);
  224.     CheckItem  (gtheMenus[kOptionsMenu],  kDither,              gDither);
  225.     
  226.     if (gColorAvail)  {
  227.         EnableItem (gtheMenus[kOptionsMenu], kOpColor);
  228.         CheckItem  (gtheMenus[khOPColorMenu],gOPColor.menuIndex,true);
  229.  
  230.         EnableItem (gtheMenus[kOptionsMenu], kHiliteColor);
  231.         CheckItem  (gtheMenus[khHiliteMenu], gHiliteColor.menuIndex,true);
  232.         }
  233.     else  {
  234.         DisableItem(gtheMenus[khFGColorMenu], kCustomColor);
  235.         DisableItem(gtheMenus[khFGColorMenu], kCustomColor);
  236.  
  237.         DisableItem(gtheMenus[kOptionsMenu], kOpColor);
  238.         DisableItem(gtheMenus[kOptionsMenu], kHiliteColor);
  239.         }
  240.     
  241.     if ((gTrapSelect == kCopyDeepMask) || (gTrapSelect == kCopyBits))  {
  242.         EnableItem (gtheMenus[kOptionsMenu],  kCopyModeSelect);
  243.         EnableItem (gtheMenus[kOptionsMenu],  kMaskRgnSelect);
  244.         CheckItem  (gtheMenus[khMaskRgnMenu], gRList[kMskRgn].type,true);
  245.  
  246.         if (gTrapSelect == kCopyBits)  
  247.             DisableItem(gtheMenus[kOptionsMenu], kMskAttributes );
  248.         }
  249.     else {
  250.         DisableItem(gtheMenus[kOptionsMenu], kCopyModeSelect);
  251.         DisableItem(gtheMenus[kOptionsMenu], kMaskRgnSelect);
  252.         }
  253.  
  254.  
  255. /*--------------------------------------------------------------------------------------*/
  256. void AdjustMenus()
  257. /*
  258.     AdjustMenus will properly activate/deactivate/update each menu item in each 
  259.     of the menus to properly reflect the available selections with respect to the
  260.     currently active window.
  261. */
  262. {
  263.     WindowPtr    theActiveWindow;
  264.     
  265.     theActiveWindow = FrontWindow();        
  266.     
  267.     if (IsDAWindow(theActiveWindow)) 
  268.          AdjustMenusForDA();
  269.     else AdjustMenusForApp(); 
  270. }
  271.  
  272.  
  273. /*--------------------------------------------------------------------------------------*/
  274. void DoMenuCommand(long    menuData)
  275. {
  276.     short        theMenu;
  277.     short        theItem;
  278.     Str255        theName;
  279.     short        theRefNum;
  280.     Boolean        imageChanged = true;
  281.     OSErr        result         = noErr;
  282.     
  283.     theMenu = HiWord(menuData);
  284.     theItem = LoWord(menuData);
  285.  
  286.     switch (theMenu)  {    
  287.         case kAppleMenuID:
  288.             switch ( theItem )  {
  289.                 case kAboutBox:        AboutBitBlitz();        break;
  290.                 default:
  291.                     GetItem(GetMHandle(kAppleMenuID), theItem, theName);
  292.                     theRefNum = OpenDeskAcc(theName);
  293.                     break;
  294.                 }
  295.             break;
  296.             
  297.         case kFileMenuID:
  298.             switch ( theItem )  {
  299.                 case kNew:            break;
  300.                 case kOpen:            break;
  301.                 case kClose:        break;
  302.                 case kSave:            break;
  303.                 case kSaveAs:        break;
  304.                 case kPageSetUp:    break;
  305.                 case kPrint:        break;
  306.                 case kQuit:            gFinished = true;        break;
  307.                 }
  308.             break;
  309.             
  310.         case kEditMenuID:
  311.             switch ( theItem )  {
  312.                 case kUndo:            break;
  313.                 case kCut:            break;
  314.                 case kCopy:            break;
  315.                 case kPaste:        break;
  316.                 case kClear:        break;
  317.                 }
  318.             break;
  319.  
  320.         case kOptionsMenuID:
  321.             switch ( theItem )  {
  322.                 case kSrcAttributes:  ChangeWindowAttributes(kSrcWindow);    break;
  323.                 case kMskAttributes:  ChangeWindowAttributes(kMskWindow);    break;
  324.                 case kDstAttributes:  ChangeWindowAttributes(kDstWindow);    break;
  325.                 case kTrapSelect:     SelectTrap();                             break;
  326.                 case kUseScreenBits:  gUseScreenBits = !gUseScreenBits;
  327.                                       CheckItem (gtheMenus[kOptionsMenu],kUseScreenBits,gUseScreenBits);
  328.                                       DrawBuffer(kBitWindow);
  329.                                       DrawWindow(kBitWindow);
  330.                                       break;
  331.                 case kDither:            gDither = !gDither;
  332.                                       CheckItem (gtheMenus[kOptionsMenu],kDither,gDither);
  333.                                       if ((gCopyMode == srcCopy) || (gCopyMode == ditherCopy)) {
  334.                                           if (gDither)
  335.                                             gCopyMode = ditherCopy;
  336.                                         else
  337.                                             gCopyMode = srcCopy;
  338.                                           }
  339.                                       DrawBuffer(kBitWindow);
  340.                                       DrawWindow(kBitWindow);
  341.                                       break;
  342.                 }
  343.             break;
  344.         
  345.         case khCopyModeMenuID:     
  346.             CheckItem(gtheMenus[khCopyModeMenu],CopyMode2ModeMenuItem(gCopyMode),false);
  347.             CheckItem(gtheMenus[khCopyModeMenu],theItem,true);
  348.             gCopyMode = ModeMenuItem2CopyMode(theItem);
  349.             DrawBuffer(kBitWindow);
  350.             DrawWindow(kBitWindow);
  351.             break;        
  352.  
  353.         case khClipRgnMenuID:     
  354.             CheckItem (gtheMenus[khClipRgnMenu],gRList[kClpRgn].type,false);
  355.             SelectRgn (kClpRgn,theItem);    
  356.             CheckItem (gtheMenus[khClipRgnMenu],gRList[kClpRgn].type,true);
  357.             break;        
  358.  
  359.         case khVisRgnMenuID:     
  360.             CheckItem (gtheMenus[khVisRgnMenu],gRList[kVisRgn].type,false);
  361.             SelectRgn (kVisRgn,theItem);    
  362.             CheckItem (gtheMenus[khVisRgnMenu],gRList[kVisRgn].type,true);
  363.             break;        
  364.  
  365.         case khMaskRgnMenuID:     
  366.             CheckItem (gtheMenus[khMaskRgnMenu],gRList[kMskRgn].type,false);
  367.             SelectRgn (kMskRgn,theItem);    
  368.             CheckItem (gtheMenus[khMaskRgnMenu],gRList[kMskRgn].type,true);
  369.             break;        
  370.  
  371.         case khFGColorMenuID:
  372.             CheckItem (gtheMenus[khFGColorMenu],gFGColor.menuIndex,false);
  373.             SelectFGColor(theItem);    
  374.             CheckItem (gtheMenus[khFGColorMenu],gFGColor.menuIndex,true);
  375.             break;
  376.             
  377.         case khBKColorMenuID:    
  378.             CheckItem (gtheMenus[khBKColorMenu],gBKColor.menuIndex,false);
  379.             SelectBKColor(theItem);    
  380.             CheckItem (gtheMenus[khBKColorMenu],gBKColor.menuIndex,true);
  381.             break;
  382.  
  383.         case khOPColorMenuID:    
  384.             CheckItem (gtheMenus[khOPColorMenu],gOPColor.menuIndex,false);
  385.             SelectOPColor(theItem);    
  386.             CheckItem (gtheMenus[khOPColorMenu],gOPColor.menuIndex,true);
  387.             break;
  388.  
  389.         case khHiliteMenuID    :    
  390.             CheckItem (gtheMenus[khHiliteMenu],gHiliteColor.menuIndex,false);
  391.             SelectHiliteColor(theItem);    
  392.             CheckItem (gtheMenus[khHiliteMenu],gHiliteColor.menuIndex,true);
  393.             break;
  394.         }
  395.     HiliteMenu(0);                    
  396. }
  397.  
  398.  
  399. /*--------------------------------------------------------------------------------------*/
  400. void DoGrowWindow(WindowPtr  theWindow, EventRecord  *theEvent)
  401. {
  402.     long    newSize;
  403.     Point    newDimen, oldDimen;
  404.     
  405.     
  406.     if (theWindow != FrontWindow()) 
  407.         SelectWindow(theWindow);
  408.     else
  409.         SetPort(theWindow);
  410.         
  411.     newSize = GrowWindow(theWindow,theEvent->where,&qd.screenBits.bounds);
  412.     
  413.     if (newSize != 0)  {
  414.         SetCursor(*GetCursor(watchCursor));
  415.  
  416.         newDimen.h = LoWord(newSize);
  417.         newDimen.v = HiWord(newSize);
  418.         
  419.         if ((theWindow == gWList[kSrcWindow].window) || (theWindow == gWList[kMskWindow].window)) {
  420.             SetPort(gWList[kSrcWindow].window);
  421.             if (ResizeTestWindow(&newDimen,kSrcWindow)) { 
  422.                 oldDimen.h = gWList[kSrcWindow].window->portRect.right  - gWList[kSrcWindow].window->portRect.left;
  423.                 oldDimen.v = gWList[kSrcWindow].window->portRect.bottom - gWList[kSrcWindow].window->portRect.top;
  424.  
  425.                 SetPort(gWList[kMskWindow].window);
  426.                 if (ResizeTestWindow(&newDimen,kMskWindow))  {
  427.                     SizeWindow(gWList[kMskWindow].window,newDimen.h,newDimen.v,false);
  428.                     SizeWindow(gWList[kSrcWindow].window,newDimen.h,newDimen.v,false);
  429.                     }
  430.                 else {
  431.                     SetPort(gWList[kSrcWindow].window);
  432.                     ResizeTestWindow(&oldDimen,kSrcWindow);
  433.                     }
  434.                 }
  435.             }
  436.  
  437.         if ((theWindow == gWList[kDstWindow].window) || (theWindow == gWList[kBitWindow].window)) {
  438.             SetPort(gWList[kDstWindow].window);
  439.             if (ResizeTestWindow(&newDimen,kDstWindow))  {
  440.                 oldDimen.h = gWList[kDstWindow].window->portRect.right  - gWList[kDstWindow].window->portRect.left;
  441.                 oldDimen.v = gWList[kDstWindow].window->portRect.bottom - gWList[kDstWindow].window->portRect.top;
  442.                 
  443.                 SetPort(gWList[kBitWindow].window);
  444.                 if (ResizeTestWindow(&newDimen,kBitWindow))  {
  445.                     SizeWindow(gWList[kBitWindow].window,newDimen.h,newDimen.v,false);
  446.                     SizeWindow(gWList[kDstWindow].window,newDimen.h,newDimen.v,false);
  447.                     UpdateRgnSettings();
  448.                     }
  449.                 else {
  450.                     SetPort(gWList[kDstWindow].window);
  451.                     ResizeTestWindow(&oldDimen,kDstWindow);
  452.                     }
  453.                 }
  454.             }
  455.                 
  456.         SetPort(theWindow);
  457.                         
  458.         DrawBuffer(kBitWindow);
  459.         DrawWindow(kSrcWindow);
  460.         DrawWindow(kMskWindow);
  461.         DrawWindow(kDstWindow);
  462.         DrawWindow(kBitWindow);
  463.         
  464.         InitCursor();
  465.         }
  466. }
  467.  
  468.  
  469. /*--------------------------------------------------------------------------------------*/
  470. short abs(short    a)
  471. {
  472.     return((a<0)?-a:a);
  473. }
  474.  
  475. /*--------------------------------------------------------------------------------------*/
  476. Boolean AlmostEqualPt(Point *pt1, Point *pt2, short tolerance)
  477. /*
  478. //     AlmostEqualPt() determines if two points are equal within the specified tolerance.
  479. */
  480. {
  481.     return ((abs(pt2->h - pt1->h) < tolerance) && (abs(pt2->v - pt1->v) < tolerance));
  482. }
  483.  
  484. /*--------------------------------------------------------------------------------------*/
  485. void DoMouseDown(EventRecord  *theEvent)
  486. {
  487.     short        thePart;
  488.     WindowPtr    theWindow;
  489.     register    i;
  490.  
  491.  
  492.       gDoubleClick  = ((theEvent->when - gLastTime) <= GetDblTime());
  493.     gDoubleClick  = ( (gDoubleClick) && AlmostEqualPt(&gLastPoint,&theEvent->where,3));
  494.  
  495.     thePart = FindWindow(theEvent->where, &theWindow);
  496.     switch ( thePart )  {
  497.         case inMenuBar:    
  498.            AdjustMenus();
  499.            DoMenuCommand(MenuSelect(theEvent->where));
  500.            break;
  501.            
  502.         case inSysWindow:        
  503.            SystemClick( theEvent, theWindow );
  504.            break;
  505.            
  506.         case inContent:
  507.             if (theWindow != FrontWindow()) 
  508.                 SelectWindow(theWindow);
  509.             else  {
  510.                 SetPort(theWindow);
  511.                 if (gDoubleClick)  
  512.                     for (i=kSrcWindow; i<=kBitWindow;  i++)
  513.                         if (theWindow == gWList[i].window)
  514.                             if (i<kBitWindow)
  515.                                 ChangeWindowAttributes(i);
  516.                             else
  517.                                 SysBeep(10);
  518.                 }
  519.                break;
  520.            
  521.         case inDrag:                
  522.             DragWindow(theWindow,theEvent->where,&qd.screenBits.bounds);
  523.             if (gUseScreenBits)  {
  524.                 for (i=kSrcWindow; i<=kDstWindow;  i++)
  525.                     DrawWindow(i);
  526.                 DrawBuffer(kBitWindow);
  527.                 DrawWindow(kBitWindow);
  528.                 }
  529.             break;
  530.            
  531.         case inGrow:
  532.             DoGrowWindow(theWindow, theEvent);
  533.                break;
  534.            
  535.         case inZoomIn:
  536.         case inZoomOut:
  537.             if ( TrackBox(theWindow, theEvent->where, thePart) ) 
  538.                {
  539.                 SetPort(theWindow);                
  540.                 ZoomWindow(theWindow, thePart, true);    
  541.                 InvalRect(&theWindow->portRect);    
  542.                }
  543.             break;
  544.         }
  545.     
  546.       gLastTime  = theEvent->when;
  547.       gLastPoint = theEvent->where;
  548. }
  549.  
  550.  
  551. /*--------------------------------------------------------------------------------------*/
  552. void DoKeyDown( theEvent )
  553.     EventRecord    *theEvent;
  554. {
  555.     char        theKey;
  556.  
  557.     gCmdOn    = ( theEvent->modifiers & cmdKey );
  558.     theKey     = theEvent->message & charCodeMask;
  559.  
  560.     if ((gCmdOn) && (theEvent->what == keyDown))  {
  561.         AdjustMenus();                        
  562.         DoMenuCommand( MenuKey(theKey) );
  563.         }
  564. }
  565.  
  566.  
  567. /*--------------------------------------------------------------------------------------*/
  568. void DoUpdate(EventRecord    *theEvent)
  569. {
  570.     WindowPtr    theWindow;
  571.  
  572.     theWindow     = (WindowPtr)theEvent->message;
  573.     
  574.     if (theWindow != nil)  {
  575.         BeginUpdate(theWindow);
  576.         
  577.         if (theWindow == gWList[kSrcWindow].window)
  578.             DrawWindow(kSrcWindow);
  579.         else if (theWindow == gWList[kMskWindow].window) 
  580.             DrawWindow(kMskWindow);
  581.         else if (theWindow == gWList[kDstWindow].window) 
  582.             DrawWindow(kDstWindow);
  583.         else if (theWindow == gWList[kBitWindow].window) 
  584.             DrawWindow(kBitWindow);
  585.         
  586.         EndUpdate(theWindow);
  587.         }
  588. }
  589.  
  590.  
  591. /*--------------------------------------------------------------------------------------*/
  592. void DoEvent(EventRecord  *theEvent)
  593. {
  594.     switch (theEvent->what)  {
  595.         case nullEvent:
  596.             break;
  597.     
  598.         case mouseDown:    
  599.             DoMouseDown(theEvent);    
  600.             break;
  601.             
  602.         case keyDown:
  603.         case autoKey:    
  604.             DoKeyDown(theEvent);
  605.             break;
  606.             
  607.         case activateEvt:
  608.             InitCursor();
  609.             break;
  610.             
  611.         case updateEvt:
  612.             DoUpdate(theEvent); 
  613.             break;
  614.             
  615.         case diskEvt:
  616.             break;
  617.         }
  618.  
  619.  
  620.  
  621. /*--------------------------------------------------------------------------------------*/
  622. void MainLoop()
  623. {
  624.     EventRecord        theEvent;
  625.  
  626.     do  {
  627.         if (gWNEAvailable)
  628.             WaitNextEvent(everyEvent, &theEvent, LONG_MAX, nil);
  629.         else  {
  630.             SystemTask();
  631.             GetNextEvent(everyEvent, &theEvent);
  632.             }
  633.         
  634.         DoEvent(&theEvent);
  635.         
  636.         } while (! gFinished);
  637.         
  638. }
  639.  
  640.  
  641. /*--------------------------------------------------------------------------------------*/
  642. main()
  643. {
  644.     SysEnvRec    theWorld;
  645.     
  646.             /*  Perform standard mac initialization. */            
  647.     InitMac();        
  648.     
  649.  
  650.     SysEnvirons(1, &theWorld);
  651.     
  652.     
  653.     if (theWorld.systemVersion < 0x0700)  {
  654.         NeedSystem7Dlog();
  655.         ExitToShell();
  656.         }    
  657.  
  658.     
  659.     InitTestGlobals();
  660.     InitAppMenus();
  661.                 
  662.             /*  Initialize all of the app's windows' structures. */            
  663.     InitTestWindowAttributes();
  664.     InitColorSettings();
  665.     InitRgnSettings();
  666.     
  667.             /*  If there is not enough memory to bring up windows exit. */            
  668.     if (CreateTestWindows())     
  669.         MainLoop();
  670.         
  671.     DisposeRgnSettings();
  672.     DisposeTestWindows();
  673.     ExitToShell();
  674. }
  675.